﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SQLite;
using System.Data;

namespace Data
{
    public class ReservasDataAccess
    {
        private SQLiteConnection con = DataBaseHelper.GetConnection("BDHostal.sqlite");
        private bool exitoRegistrar;
        private DataTable dt = new DataTable();
        private DataSet dataSet = new DataSet();
        public bool registrarReserva(string numeroDocumento, string numeroHabitacion,string fechaLlegada,string fechaSalida,string fechaRegistro)
        {
            using (var cmd = con.CreateCommand())
            {
                try
                {
                    con.Open();
                    cmd.CommandText = "INSERT INTO reservas(numeroHabitacion,numeroDocumento,fechaLlegada,fechaSalida,activo,fechaRegistro) VALUES ('" + numeroHabitacion + "','" + numeroDocumento + "','" + fechaLlegada + "','" + fechaSalida +"','si','"+fechaRegistro+"')";
                    cmd.ExecuteNonQuery();
                    exitoRegistrar = true;
                }
                catch (SQLiteException ex)
                {
                    exitoRegistrar = false;
                }
                finally
                {
                    cmd.Dispose();
                    con.Close();
                }
            }
            return exitoRegistrar;
        }

        public System.Data.DataTable buscarReservaFecha(string fechaLlegada,string fechaSalida,string tipoHabitacion)
        {
            string parcial2 = "SELECT numeroHabitacion FROM reservas WHERE  activo='si' AND (('" + fechaLlegada + "' BETWEEN fechaLlegada AND fechaSalida) OR ('" + fechaSalida + "' BETWEEN fechaLlegada AND fechaSalida) OR (fechaLlegada BETWEEN '" + fechaLlegada + "' AND '" + fechaSalida + "') OR (fechaSalida BETWEEN '" + fechaLlegada + "' AND '" + fechaSalida + "'))";
            string parcial= "SELECT numeroHabitacion FROM hospedajes WHERE  activo='si' AND (('" + fechaLlegada + "' BETWEEN fechaLlegada AND fechaSalida) OR ('" + fechaSalida + "' BETWEEN fechaLlegada AND fechaSalida) OR (fechaLlegada BETWEEN '" + fechaLlegada + "' AND '" + fechaSalida + "') OR (fechaSalida BETWEEN '" + fechaLlegada + "' AND '" + fechaSalida + "'))";
            string cmd = "SELECT numero,tipo,capacidad FROM habitacion WHERE tipo='" + tipoHabitacion + "' AND state='1' AND (numero NOT IN ("+parcial+") AND numero NOT IN ("+parcial2+"))";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
            return dt;
        }

        public DataTable buscarReserva(string nombre)
        {
            nombre = nombre.ToLowerInvariant();
            string cmd = "SELECT DISTINCT nombre,apellido,r.numeroDocumento,fechaLlegada,fechaSalida,fechaRegistro FROM reservas r,clientes c WHERE (nombre like '" + nombre + "%' OR nombre like '% " + nombre + "%' OR apellido like '" + nombre + "%' OR apellido like '% " + nombre + "%') AND r.numeroDocumento = c.numeroDocumento AND r.activo='si'";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
            return dt;
        }

        public DataTable buscarTodosDatos(string numeroDocumento, string fechaLlegada, string fechaRegistro)
        {
            string cmd = "SELECT DISTINCT capacidad,numeroHabitacion,fechaLlegada,FechaSalida,nombre,apellido,r.numeroDocumento,email,telefono,celular,notas,tipo,fechaRegistro FROM habitacion h,reservas r,clientes c WHERE activo='si' AND r.numeroDocumento = c.numeroDocumento AND r.numeroDocumento = '" + numeroDocumento + "' AND fechaLlegada='" + fechaLlegada + "' AND fechaRegistro='" + fechaRegistro + "' AND r.numeroHabitacion = h.numero";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
            return dt;
        }

        public void cancelarReserva(string numeroHabitacion, string numeroDocumento, string fechaLlegada)
        {
            string cmd = "UPDATE reservas SET activo='no' WHERE numeroDocumento ='"+numeroDocumento+"' AND numeroHabitacion = '"+numeroHabitacion+"' AND fechaLlegada='"+fechaLlegada+"' AND activo='si'";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
        }

        public bool existeReserva(string numeroDocumento, string numeroHabitacion, string fechaLlegada,string fechaRegistro)
        {
            bool resultado;
            string cmd = "SELECT numeroHabitacion FROM reservas WHERE numeroDocumento='" + numeroDocumento + "' AND numeroHabitacion='" + numeroHabitacion + "' AND fechaLlegada='" + fechaLlegada + "' AND fechaRegistro='"+fechaRegistro+"' AND activo='no'";
            {
                try
                {
                    con.Open();
                    DataSet dataSet = new DataSet();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    DataTable dt = new DataTable();
                    dt = dataSet.Tables[0];
                    DataRow dataRow;
                    if (!dt.Rows[0].Equals(null))
                    {
                        dataRow = dt.Rows[0];
                        resultado = true;
                    }
                    else
                        resultado = false;
                }
                catch (SystemException ex)
                {
                    resultado = false;
                }
                finally
                {
                    con.Dispose();
                    con.Close();
                }
            }
            return resultado;
        }

        public void activarReserva(string numeroDocumento, string numeroHabitacion, string fechaLlegada,string fechaSalida,string fechaRegistro,string fechaRegistroAntiguo)
        {
            string cmd = "UPDATE reservas SET activo='si' , fechaSalida ='" + fechaSalida + "' , fechaRegistro = '"+fechaRegistro+"' WHERE numeroDocumento ='" + numeroDocumento + "' AND numeroHabitacion = '" + numeroHabitacion + "' AND fechaLlegada ='" + fechaLlegada + "' AND fechaRegistro = '"+fechaRegistroAntiguo+"'";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
        }
        public void editarReserva(string numeroHabitacion, string numeroDocumento, string fechaLlegada, string numeroHabitacionAntiguo, string numeroDocumentoAntiguo, string fechaLlegadaAntiguo,string fechaSalida)
        {
            string cmd = "UPDATE reservas SET numeroHabitacion='"+numeroHabitacion+"',numeroDocumento='"+numeroDocumento+"',fechaLlegada='"+fechaLlegada+"',fechaSalida='"+fechaSalida+"',fechaLlegadaString='"+fechaLlegada+"',fechaSalidaString='"+fechaSalida+"' WHERE numeroDocumento ='" + numeroDocumentoAntiguo + "' AND numeroHabitacion = '" + numeroHabitacionAntiguo + "' AND fechaLlegada='" + fechaLlegadaAntiguo + "'";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
        }

        public DataTable buscarReservaFechaYNumeroHabitacion(string fechaLlegada, string fechaSalida, string numeroHabitacion)
        {
            string cmd = "SELECT numero FROM habitacion WHERE (state='1' AND numero NOT IN (SELECT numeroHabitacion FROM reservas WHERE activo='si' AND '" + fechaLlegada + "' BETWEEN fechaLlegada AND fechaSalida  AND '" + fechaSalida + "' BETWEEN fechaLlegada AND fechaSalida AND numeroHabitacion!='"+numeroHabitacion+"'))";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
            return dt;
        }

        public void habilitarReserva(string numeroHabitacion, string numeroDocumento, string fechaLlegada)
        {
            string cmd = "UPDATE reservas SET activo='si' WHERE numeroDocumento ='" + numeroDocumento + "' AND numeroHabitacion = '" + numeroHabitacion + "' AND fechaLlegada='" + fechaLlegada + "' AND activo='no'";
            {
                try
                {
                    con.Open();
                    SQLiteDataAdapter dataAdapter = new SQLiteDataAdapter(cmd, con);
                    dataSet.Reset();
                    dataAdapter.Fill(dataSet);
                    dt = dataSet.Tables[0];
                }
                catch (SystemException ex){}
                finally
                {
                    con.Close();
                }
            }
        }

        public bool registrarReservaExitosa(string numeroDocumento, string numeroHabitacion, string fechaLlegada, string fechaSalida, string fechaRegistro)
        {
            using (var cmd = con.CreateCommand())
            {
                try
                {
                    con.Open();
                    cmd.CommandText = "INSERT INTO reservasCanceladas(numeroHabitacion,numeroDocumento,fechaLlegada,fechaSalida,fechaRegistro) VALUES ('" + numeroHabitacion + "','" + numeroDocumento + "','" + fechaLlegada + "','" + fechaSalida + "','" + fechaRegistro + "')";
                    cmd.ExecuteNonQuery();
                    exitoRegistrar = true;
                }
                catch (SQLiteException ex)
                {
                    exitoRegistrar = false;
                }
                finally
                {
                    cmd.Dispose();
                    con.Close();
                }
            }
            return exitoRegistrar;
        }
    }
}
